﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;

namespace _2D
{
    /// <summary>
    /// Esta clase es la encargada de iniciar cada uno de los niveles del juego.
    /// </summary>
    public class Level
    {
        private Map currentMap;
        private Character character;
        private Camera2D _camera;
        ContentManager _content;
        int backBufferWidth;
        int backBufferHeight;
        private CollisionEngine _collisionControl;

        private Boolean debug;

        public Level()
        {
            debug = false;
        }

        public void Load(ContentManager content, int screenWidth, int screenHeight)
        {
            // 1.- Cargamos el mapa.
            // 2.- Cargamos los personajes.

            currentMap = new _2D.Map();

            // Definimos el vector donde estará la cámara en origen.
            Vector2 vectorOrigen = new Vector2(0, 0);

            currentMap.Load(content, @"Images\summertiles", @"../../../TileMaps/tileMap1.xml", @"../../../Maps/Map1.xml", vectorOrigen,
            800, 608);

            // Creamos la cámara.
            _camera = new Camera2D((int)vectorOrigen.X, (int)vectorOrigen.Y);

            // TODO: Los personajes deben estar posicionados según las coordenadas de ancho/alto del mapa.
            character = new Character(0, 0, @"../../../Animations/AnimationWizard1.xml", content);

            _content = content;
            backBufferWidth = screenWidth;
            backBufferHeight = screenHeight;


            // Creamos una instancia del motor de colisiones y le pasamos los parámetros.
            _collisionControl = new CollisionEngine();
            _collisionControl.collisionBoxes = currentMap.Collisions;
            _collisionControl.AddICollisionable(character);
        }

        public void Update(KeyboardState ks, GameTime gameTime)
        {
            // 1.- Actualizamos el mapa.
            // 2.- Actualizamos los personajes.

            if (ks.IsKeyDown(Keys.Left))
            {
                if ((character.position.X <= (_camera.position.X + (currentMap.areaWidth / 10))) 
                    && (_camera.position.X > 0))    // 10% del ancho de la pantalla.
                {
                    //move = !currentMap.Update(ks);
                    _camera.moveCamera(-1,0);
                }
            }

            if (ks.IsKeyDown(Keys.Right))
            {
                if ((character.position.X >= (_camera.position.X + ((currentMap.areaWidth / 10) * 9))) && 
                    ((_camera.position.X + backBufferWidth) < currentMap.bgWidth))  // 90% del ancho de la pantalla.
                {
                    _camera.moveCamera(1, 0);
                }
            }

            if (ks.IsKeyDown(Keys.Up))
            {
                if ((character.position.Y <= (_camera.position.Y + ((currentMap.areaHeight / 10) * 2)))
                    && (_camera.position.Y > 0))    // 20% del alto.
                {
                    _camera.moveCamera(0, -1);
                }
            }

            if (ks.IsKeyDown(Keys.Down))
            {
                if ((character.position.Y >= (_camera.position.Y + ((currentMap.areaHeight / 10) * 8))) &&
                    ((_camera.position.Y + backBufferHeight) < currentMap.bgHeight))      // 80% del alto.
                {
                    _camera.moveCamera(0, 1);
                }
            }


            character.Update(ks, gameTime);

            _collisionControl.checkCollisions();

        }

        public void Draw(SpriteBatch batch)
        {
            // 1.- Dibujamos el mapa.
            // 2.- Dibujamos los personajes.

            currentMap.Draw(batch, _camera);
            character.Draw(batch,_camera.position);

            if (debug)
            {
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "X: " + character.position.X.ToString(), new Vector2(10, 10), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Y: " + character.position.Y.ToString(), new Vector2(10, 20), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Ventana: ", new Vector2(10, 30), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Width: " + backBufferWidth.ToString(), new Vector2(10, 40), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Height: " + backBufferHeight.ToString(), new Vector2(10, 50), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Collision box (current animation): ", new Vector2(10, 60), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "X: " + character.GetBoundingBox().X.ToString(), new Vector2(10, 70), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Y: " + character.GetBoundingBox().Y.ToString(), new Vector2(10, 80), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Width: " + character.GetBoundingBox().Width.ToString(), new Vector2(10, 90), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Height: " + character.GetBoundingBox().Height.ToString(), new Vector2(10, 100), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Camera: ", new Vector2(10, 110), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "X: " + _camera.position.X.ToString(), new Vector2(10, 120), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Y: " + _camera.position.Y.ToString(), new Vector2(10, 130), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Character After Position: ", new Vector2(10, 140), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "X: " + character.beforePosition.X.ToString(), new Vector2(10, 150), Color.White);
                batch.DrawString(_content.Load<SpriteFont>("Fonts/Font1"), "Y: " + character.beforePosition.Y.ToString(), new Vector2(10, 160), Color.White);
            }
        }
    }
}
